%------------------------------------------------------------------------%
%              Comunicaciones digitales y analógicas                     %
%                      Trabajo Práctico N 1                              %
%                                                                        %
%                       Eric Lionel Koplin                               %
%------------------------------------------------------------------------%
close all;clear all;clc;


% Parámetros:
M = 16;
d = 2;
%% 1.1) Constelaciones y regiones de decision
%--------------------------------------------------------------- M-PAM BP

% Constelación
% como d=2 la energía del pulso formador es Ep=8/d^2
%Am= [(-M+1:d:M-1)' zeros(M,1)];       % verctor de amplitudes
%sm = sqrt(2/d) .* Am; % simbolos

simbtx = (0:M-1)';
simbtx_bin = dec2bin(simbtx);
% Genero un objeto ”modulador PAM” con M = 4 , codigo Gray y la especifico
% por su energia promedio Eavg (definida mas arriba )
modPAM = comm.PAMModulator(M,'MinimumDistance',d) ; % Energia promedio deseada = 1
% Genero un objeto ”demodulador PAM” con las mismas especificaciones que e l
% modulador
simbmod = step(modPAM,simbtx); % simbolos modulados para su transmision ”OJO , son COMPLEJOS”
sm = [real(simbmod) imag(simbmod)];


%Constelación:
plot(sm(:,1),sm(:,2),'x','MarkerFaceColor','g','MarkerSize',5);hold on;
xlabel('In-Phase');
ylabel('Quadrature');
title('Constelación M-PAM');

% labels
label_offset = [0*ones(M,1) 0.1*ones(M,1)];
%plabels = arrayfun(@(n) {sprintf('s%d', n)}, (1:M)');
plabels = arrayfun(@(n) {simbtx_bin(n,:)}, (1:M)');
Hpl = text(sm(:,1)+label_offset(:,1), sm(:,2) + label_offset(:,2), plabels, 'FontWeight', ...
      'bold', 'HorizontalAlignment','center', ...
      'BackgroundColor', 'none');

%axis([-M M -1 1]);
%print('../Figs/constell_pam.png','-dpng')
print('../Figs/gray_pam.png','-dpng')
% Regiones de desición

median = 1/2*(sm(1:end-1,:) + sm(2:end,:));
yL = get(gca,'YLim');
line([median(:,1) median(:,1)]',yL,'Color','r','LineStyle','-.');hold off;
%print('../Figs/region_pam.png','-dpng')
%%
%--------------------------------------------------------------- M-PSK

% Constelación
% como d=2 la energía del pulso formador es Ep=8/d^2
m= (1:M)';       % verctor de amplitudes
%sm = d/(2*sin(pi/M)) * [cos(2*pi/M * (m-1)) sin(2*pi/M * (m-1))]; % simbolos

simbtx = (0:M-1)';
simbtx_bin = dec2bin(simbtx);
modPSK = comm.PSKModulator(M) ; % Energia promedio deseada = 1
% Genero un objeto ”demodulador PAM” con las mismas especificaciones que e l
% modulador
simbmod = step(modPSK,simbtx); % simbolos modulados para su transmision ”OJO , son COMPLEJOS”
sm = [real(simbmod) imag(simbmod)];
sm = d/(2*sin(pi/M)).*sm; %normalizo la energia

%Constelación:
figure
plot(sm(:,1),sm(:,2),'x','MarkerFaceColor','g','MarkerSize',5); hold on;
xlabel('In-Phase');
ylabel('Quadrature');
title('Constelación M-PSK');

% labels
label_offset = [0*ones(M,1) 0.1*ones(M,1)];
%plabels = arrayfun(@(n) {sprintf('s%d', n)}, (1:M)');
plabels = arrayfun(@(n) {simbtx_bin(n,:)}, (1:M)');
Hpl = text(sm(:,1)+label_offset(:,1), sm(:,2) + label_offset(:,2), plabels, 'FontWeight', ...
      'bold', 'HorizontalAlignment','center', ...
      'BackgroundColor', 'none');

%axis([-M M -1 1]);
%print('../Figs/constell_psk.png','-dpng')
print('../Figs/gray_psk.png','-dpng')
% Regiones de desición

median = 1/2*(sm(1:end,:) + [sm(2:end,:);sm(1,:)]);
yL = get(gca,'YLim');
%line(median(:,1),median(:,2),)
plotv(median','-.r'); hold off;
%print('../Figs/region_psk.png','-dpng')
%%
%--------------------------------------------------------------- M-QAM

% Constelación
% como d=2 la energía del pulso formador es Ep=8/d^2
%{
k = 4;
Am= (-k+1:d:k-1)';       % verctor de amplitudes
smpam = sqrt(2/d) .* Am; % simbolos
[X,Y] = meshgrid(smpam,smpam);
sm = [X(:) Y(:)];
%}
simbtx = (0:M-1)';
simbtx_bin = dec2bin(simbtx);

modQAM = comm.RectangularQAMModulator(M,'MinimumDistance',d) ; % Energia promedio deseada = 1
% Genero un objeto ”demodulador PAM” con las mismas especificaciones que e l
% modulador
simbmod = step(modQAM,simbtx); % simbolos modulados para su transmision ”OJO , son COMPLEJOS”
sm = [real(simbmod) imag(simbmod)];


%Constelación:
figure
plot(sm(:,1),sm(:,2),'x','MarkerFaceColor','g','MarkerSize',5); hold on;
xlabel('In-Phase');
ylabel('Quadrature');
title('Constelación M-QAM');

% labels
%label_offset = [0*ones(M,1) 0.1*ones(M,1)];
%plabels = arrayfun(@(n) {sprintf('s%d', n)}, (1:M)');
plabels = arrayfun(@(n) {simbtx_bin(n,:)}, (1:M)');
Hpl = text(sm(:,1)+label_offset(:,1), sm(:,2) + label_offset(:,2), plabels, 'FontWeight', ...
      'bold', 'HorizontalAlignment','center', ...
      'BackgroundColor', 'none');

%axis([-M M -1 1]);
%print('../Figs/constell_qam.png','-dpng')
print('../Figs/gray_qam.png','-dpng')
% Regiones de desición

median = 1/2*(smpam(1:end-1,:) + smpam(2:end,:));
yL = get(gca,'YLim');
xL = get(gca,'XLim');
line([median(:,1) median(:,1)]',yL,'Color','r','LineStyle','-.')
line(xL,[median(:,1) median(:,1)]','Color','r','LineStyle','-.');hold off;
%print('../Figs/region_qam.png','-dpng')